﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AgendaManager.AgendaService;
using System.IO;

namespace AgendaManager
{
    public partial class frmNuevoContacto : Form
    {
        Bitmap originalFoto { get; set; }
        public Contacto Contacto { get; set; }
        public FotoContacto FotoContacto { get; set; }
        List<Obra> Obras { get; set; }
        List<ObraContacto> ObraContactos { get; set; }

        public frmNuevoContacto()
        {
            InitializeComponent();
        }

        private void btnAgregarFoto_Click(object sender, EventArgs e)
        {
            this.openFileDialog.Filter = "Images (*.BMP;*.JPG;*.GIF,*.PNG,*.TIFF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" +
                "All files (*.*)|*.*";

            this.openFileDialog.Multiselect = false;
            this.openFileDialog.Title = "Select Photos";

            DialogResult dr = this.openFileDialog.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                foreach (String file in openFileDialog.FileNames)
                {
                    try
                    {
                        Image.GetThumbnailImageAbort myCallback =
                                new Image.GetThumbnailImageAbort(ThumbnailCallback);
                        Bitmap myBitmap = new Bitmap(file);
                        
                        originalFoto = myBitmap;

                        //Image myThumbnail = myBitmap.GetThumbnailImage(170, 149,
                        Image myThumbnail = myBitmap.GetThumbnailImage(150, 150,
                            myCallback, IntPtr.Zero);

                        pbFoto.Image = myThumbnail;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.Message);
                    }
                }
            }

        }

        public bool ThumbnailCallback()
        {
            return false;
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarDatos())
            {
                if (Contacto == null)
                    Contacto = new Contacto();

                Contacto.Nombre = txNombre.Text;
                Contacto.Apellido = txApellido.Text;
                Contacto.Celular = txCelular.Text;
                Contacto.Telefono = txTelefono.Text;
                
                if (dtNacimiento.Enabled)
                    Contacto.FechaNacimiento = dtNacimiento.Value.Date;
                else
                    Contacto.FechaNacimiento = null;
                
                Contacto.InformacionAdicional = txInfo.Text;
                
                Contacto.Email = txEmail.Text;
                Contacto.Puesto = txPuesto.Text;


                if (FotoContacto == null)
                    FotoContacto = new FotoContacto();

                if (pbFoto.Image != null)
                {
                    FotoContacto.Foto = ImageToByteArray(pbFoto.Image);
                    if (Contacto.Id != 0)
                    {
                        FotoContacto.IdContacto = Contacto.Id;
                    }
                }
                try
                {
                    if (Contacto.Id == 0)
                    {
                        Contacto aux = ConnectHelper.ws.NuevoContacto(Contacto, FotoContacto, ObraContactos.ToArray());

                        if (aux.Id != 0)
                        {
                            MessageBox.Show("El Contacto ha sido creado exitosamente.",
                                    "Nuevo Contacto.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);

                            this.DialogResult = System.Windows.Forms.DialogResult.OK;
                            this.Close();
                        }
                    }
                    else
                    {
                        bool actualizo = ConnectHelper.ws.UpdateContacto(Contacto, FotoContacto, ObraContactos.ToArray());
                        if (actualizo)
                        {
                            MessageBox.Show("El Contacto ha sido actualizado exitosamente.",
                                    "Nuevo Contacto.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);

                            this.DialogResult = System.Windows.Forms.DialogResult.OK;
                            this.Close();
                        }
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Ha ocurrido un error inesperado, por favor contacte al administrador del sistema.",
                                "Error.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                }
                

            }

        }

        private bool ValidarDatos()
        {
            return true;
            //throw new NotImplementedException();
        }


        public byte[] ImageToByteArray(Image img)
        {
            MemoryStream ms = new System.IO.MemoryStream();
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }

        private void btAgregarObra_Click(object sender, EventArgs e)
        {
            using (frmSeleccionObra f = new frmSeleccionObra())
            {
                f.NombreContacto = txNombre.Text + " " + txApellido.Text;
                f.isContact = true;

                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    //if (f.Obra != null)
                    //    Obras.Add(f.Obra);

                    Obras = ConnectHelper.ws.RetrieveEntities(new Obra(), string.Empty).Cast<Obra>().ToList();

                    ObraContacto obraContacto = new ObraContacto();
                    obraContacto.IdObra = f.Obra.Id;
                    obraContacto.Telefono = f.ObraContacto.Telefono;
                    if (Contacto.Id != 0)
                    {
                        obraContacto.IdContacto = Contacto.Id;
                    }

                    ObraContactos.Add(obraContacto);

                    var gvJoin = from obras in Obras
                              join obrasContactos in ObraContactos
                              on obras.Id equals obrasContactos.IdObra
                              select new {
                                  ObraId = obras.Id,
                                  Nombre = obras.Nombre,
                                  NumeroContrato = obras.NumeroContrato,
                                  Prestador = obras.Prestador,
                                  TipoObra = obras.TipoObra,
                                  Telefono = obrasContactos.Telefono
                              };

                    this.gvObras.DataSource = gvJoin.ToList();
                }
            }
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvObras.SelectedRows.Count == 1)
            {
                Obras.RemoveAll(x => x.Id == (int)gvObras.SelectedRows[0].Cells["ObraId"].Value);
                ObraContactos.RemoveAll(x => x.IdObra == (int)gvObras.SelectedRows[0].Cells["ObraId"].Value);


                var gvJoin = from obras in Obras
                             join obrasContactos in ObraContactos
                             on obras.Id equals obrasContactos.IdObra
                             select new
                             {
                                 ObraId = obras.Id,
                                 Nombre = obras.Nombre,
                                 NumeroContrato = obras.NumeroContrato,
                                 Prestador = obras.Prestador,
                                 TipoObra = obras.TipoObra,
                                 Telefono = obrasContactos.Telefono
                             };

                gvObras.DataSource = gvJoin;
            }
        }

        private void frmNuevoContacto_Load(object sender, EventArgs e)
        {
            //if (FotoContacto == null)
            //    FotoContacto = new FotoContacto();
            //if (Contacto == null)
            //    Contacto = new Contacto();
            //if (Obras == null)
            //    Obras = new List<Obra>();
            //if (ObraContactos == null)
            //    ObraContactos = new List<ObraContacto>();
            dtNacimiento.Enabled = false;
            FotoContacto = new FotoContacto();
            Obras = new List<Obra>();
            ObraContactos = new List<ObraContacto>();

            if (Contacto == null)
            {
                Contacto = new Contacto();
                //FotoContacto = new FotoContacto();
                //Obras = new List<Obra>();
                //ObraContactos = new List<ObraContacto>();
            }
            else
            {
                if (Contacto.FechaNacimiento.HasValue)
                {
                    dtNacimiento.Value = Contacto.FechaNacimiento.Value;
                    dtNacimiento.Enabled = true;
                }
                else
                    dtNacimiento.Value = DateTime.Today;

                txApellido.Text = Contacto.Apellido;
                txCelular.Text = Contacto.Celular;
                txEmail.Text = Contacto.Email;
                //txEmpresa
                txInfo.Text = Contacto.InformacionAdicional;
                txNombre.Text = Contacto.Nombre;
                txPuesto.Text = Contacto.Puesto;
                txTelefono.Text = Contacto.Telefono;

                if (Contacto.Empresa != null)
                {
                    Empresa empresa = ConnectHelper.ws.RetrieveEntitiesWhere(new Empresa(), string.Format("Id = {0}", Contacto.Empresa)).Cast<Empresa>().First();
                    txEmpresa.Text = empresa.RazonSocial;
                }

                FotoContacto = new FotoContacto();
                
                FotoContacto = ConnectHelper.ws.GetFotoContacto(Contacto.Id);

                if (FotoContacto.Foto != null)
                {
                    Image img = byteArrayToImage(FotoContacto.Foto);

                    pbFoto.Image = img;    
                }
                
                //}

                ObraContactos = ConnectHelper.ws.RetrieveEntitiesWhere(new ObraContacto(), string.Format("IdContacto = {0}", Contacto.Id)).Cast<ObraContacto>().ToList();
                if (ObraContactos.Count > 0)
                {
                    Obras = ConnectHelper.ws.RetrieveEntities(new Obra(), string.Empty).Cast<Obra>().ToList();

                    var gvJoin = from obras in Obras
                                 join obrasContactos in ObraContactos
                                 on obras.Id equals obrasContactos.IdObra
                                 select new
                                 {
                                     ObraId = obras.Id,
                                     Nombre = obras.Nombre,
                                     NumeroContrato = obras.NumeroContrato,
                                     Prestador = obras.Prestador,
                                     TipoObra = obras.TipoObra,
                                     Telefono = obrasContactos.Telefono
                                 };

                    gvObras.DataSource = gvJoin.ToList();
                }

            }
        }

        private void btnEmpresa_Click(object sender, EventArgs e)
        {
            using (frmSeleccionEmpresa f = new frmSeleccionEmpresa())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Contacto.Empresa = f.Empresa.Id;
                    txEmpresa.Text = f.Empresa.RazonSocial;
                }
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.Close();
        }

        public Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

        private void checkNacimiento_CheckedChanged(object sender, EventArgs e)
        {
            dtNacimiento.Enabled = !dtNacimiento.Enabled;
        }
       
    }
}
